package com.sxt.core.utils;

import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.sxt.core.context.IocContext;
import com.sxt.core.model.BeanDefine;

/**
 * 给对象注入属性
 * @author Liushuangxi
 *
 */
public class PropInjectUtil {
	/**
	 *  对象的属性注入
	 * @param beanDefines
	 *  对象的定义对象
	 * @param context
	 *  ioc容器
	 */
	public static void injectProps(List<BeanDefine> beanDefines,IocContext iocContext) {
		 for (BeanDefine beanDefine : beanDefines) {
			 // 根据id在ioc容器里面获取对象
			 Object object = iocContext.getBean(beanDefine.getId());
			 // 得到对象的属性
			 Map<String, Object> props = beanDefine.getProps();
			 if(!props.isEmpty()) {
				 //得到对象的属性的名称
				 Set<String> fieldNames = props.keySet();
				 for (String fieldName : fieldNames) {
					 try {
						 //得到对象的属性
						Field field = object.getClass().getDeclaredField(fieldName);
						field.setAccessible(true);
						Object fieldValue = null ;
						// 得到属性值,分两种情况，直接得到值注入，引用对象注入
						Object preFiledValue = props.get(fieldName);
						if (preFiledValue.equals("")) { // 属性的值为null ，为类型注入
							Class<?> type = field.getType();
							// 得到属性值，即对象
							fieldValue = iocContext.getBean(type);
						} else {
							//
							fieldValue = handleSimpleType(preFiledValue, field.getType());
						}
						field.set(object, fieldValue);
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			 }
		}
	}

	/**
	 * 处理属性值得结果
	 * @param preFiledValue
	 * @param targetType
	 * @return
	 */
	private static Object handleSimpleType(Object preFiledValue, Class<?> targetType) {
		switch (targetType.getSimpleName()) {
		case "Integer":
		case "int":
               return Integer.valueOf(String.valueOf(preFiledValue));
		case "Long":
		case "long":
               return Long.valueOf(String.valueOf(preFiledValue));
		case "Double":
		case "double":
               return Double.valueOf(String.valueOf(preFiledValue));
		case "Short":
		case "short":
               return Short.valueOf(String.valueOf(preFiledValue));
		case "Float":
		case "float":
               return Float.valueOf(String.valueOf(preFiledValue));
		case "Byte":
		case "byte":
               return Byte.valueOf(String.valueOf(preFiledValue));
		case "Boolean":
		case "boolean":
               return Boolean.valueOf(String.valueOf(preFiledValue));
		case "String":
			 return  String.valueOf(preFiledValue) ;
		default:
			 throw new RuntimeException("不支持的简单类型");
		}
	}
	
	public static void main(String[] args) {
		List<BeanDefine> list = PackageScanUtil.packagSanAndGetBeanDefine("com.sxt.core.model");
		//IocContext iocContext = new IocContext();
		//injectProps(list,iocContext);
	}
}
